package com.allen.study.application.api.assembler.mapper;

import com.allen.study.application.api.request.ApprovalRecordCreateRequest;
import com.allen.study.application.api.request.ApprovalRecordQueryRequest;
import com.allen.study.application.api.request.ApprovalRecordUpdateRequest;
import com.allen.study.application.api.response.ApprovalRecordQueryResponse;
import com.allen.study.application.api.response.ApprovalRecordResponse;
import com.allen.study.domain.entity.ApprovalRecord;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

import java.util.List;

/**
 * 审批记录表数据传输对象结构映射
 *
 * @author AllenSun
 * @since 2025-04-23 20:46
 */
@Mapper
public interface IApprovalRecordDTOStructMapper {

    /**
     * 审批记录表数据传输对象结构映射实例
     */
    IApprovalRecordDTOStructMapper INSTANCE = Mappers.getMapper(IApprovalRecordDTOStructMapper.class);

    /**
     * 审批记录表创建请求数据传输对象 转 审批记录表实体
     *
     * @param createRequest 审批记录表创建请求数据传输对象
     * @return 审批记录表实体
     */
    ApprovalRecord fromCreateRequest(ApprovalRecordCreateRequest createRequest);

    /**
     * 审批记录表更新请求数据传输对象 转 审批记录表实体
     *
     * @param updateRequest 审批记录表更新请求数据传输对象
     * @return 审批记录表实体
     */
    ApprovalRecord fromUpdateRequest(ApprovalRecordUpdateRequest updateRequest);

    /**
     * 审批记录表查询请求数据传输对象 转 审批记录表实体
     *
     * @param queryRequest 审批记录表查询请求数据传输对象
     * @return 审批记录表实体
     */
    ApprovalRecord fromQueryRequest(ApprovalRecordQueryRequest queryRequest);

    /**
     * 审批记录表实体 转 审批记录表响应数据传输对象
     *
     * @param approvalRecord 审批记录表实体
     * @return 审批记录表响应数据传输对象
     */
    ApprovalRecordResponse toResponse(ApprovalRecord approvalRecord);

    /**
     * 审批记录表实体 转 审批记录表查询响应数据传输对象
     *
     * @param approvalRecord 审批记录表实体
     * @return 审批记录表查询响应数据传输对象
     */
    ApprovalRecordQueryResponse toQueryResponse(ApprovalRecord approvalRecord);

    /**
     * 审批记录表实体列表 转 审批记录表查询响应数据传输对象列表
     *
     * @param approvalRecordList 审批记录表实体列表
     * @return 审批记录表查询响应数据传输对象列表
     */
    List<ApprovalRecordQueryResponse> toQueryResponse(List<ApprovalRecord> approvalRecordList);
}
